package main

import (
	"fmt"
	"math"
)

// 继续 10.3 中的练习 point_methods.go，定义接口 Magnitude，它有一个方法 Abs()。
// 让 Point、Point3 及 Polar 实现此接口。通过接口类型变量使用方法做 point.go 中同样的事情。

type Magnitude interface {
	Abs() float32
}

type Point struct {
	x, y float32
}

type Point3 struct {
	x, y, z float32
}

func (p *Point) Abs() float32 {
	return float32(math.Sqrt(float64(p.x*p.x + p.y*p.y)))
}

func (p *Point) Scale(f float32) {
	p.x *= f
	p.y *= f
}

func (p *Point3) Abs() float32 {
	return float32(math.Sqrt(float64(p.x*p.x + p.y*p.y + p.z*p.z)))
}

func (p *Point3) Scale(f float32) {
	p.x *= f
	p.y *= f
	p.z *= f
}

type Polar struct {
	R, Theta float32
}

func (p *Polar) Abs() float32 {
	return p.R
}

func AbsLess(a, b Magnitude) bool {
	return a.Abs() < b.Abs()
}

func main() {
	var p2 = new(Point)
	p2.x = 14.0
	p2.y = 15.0
	p3 := &Point3{7, 7, 7}
	if AbsLess(p2, p3) {
		fmt.Println("p2 Abs less than p3")
	} else {
		fmt.Println("p3 Abs less than p2")
	}
}
